package main

import "fmt"

/*
现有一份 n + m次投掷单个 六面 骰子的观测数据，骰子的每个面从 1 到 6 编号。
观测数据中缺失了 n 份，你手上只拿到剩余m 次投掷的数据。幸好你有之前计算过的这 n + m 次投掷数据的 平均值 。
给你一个长度为 m 的整数数组 rolls ，其中rolls[i] 是第 i 次观测的值。同时给你两个整数 mean 和 n 。
返回一个长度为 n 的数组，包含所有缺失的观测数据，且满足这 n + m 次投掷的 平均值 是 mean 。如果存在多组符合要求的答案，
只需要返回其中任意一组即可。如果不存在答案，返回一个空数组。
k个数字的 平均值 为这些数字求和后再除以k 。
注意 mean 是一个整数，所以 n + m 次投掷的总和需要被n + m整除。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/find-missing-observations
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

func missingRolls1(rolls []int, mean int, n int) []int {
	result := []int{}
	if mean == 0 || n == 0 {
		return result
	}

	allSum := mean * (len(rolls) + n)
	rollsSum := 0
	for i := range rolls {
		rollsSum += rolls[i]
	}

	missSum := allSum - rollsSum
	// 已有数据大于总数  || 已有数 加上缺失个数全为6 仍然不足
	if missSum < n || missSum > 6*n {
		return result
	}

	quotient := missSum / n
	remainder := missSum % n
	for ; n > 0; n-- {
		if remainder > 0 {
			result = append(result, quotient+1)
			remainder--
		} else {
			result = append(result, quotient)
		}
	}

	return result
}

func main() {
	test1()
	test2()
	test3()
	test4()

}

// rolls = [3,2,4,3], mean = 4, n = 2  -- [6,6]
func test1() {
	rolls := []int{3, 2, 4, 3}
	mean := 4
	n := 2
	fmt.Println(missingRolls(rolls, mean, n))

}

// rolls = [1,5,6], mean = 3, n = 4  -- [2,3,2,2]
func test2() {
	rolls := []int{1, 5, 6}
	mean := 3
	n := 4
	fmt.Println(missingRolls(rolls, mean, n))

}

// rolls = [1,2,3,4], mean = 6, n = 4  -- []
func test3() {
	rolls := []int{1, 2, 3, 4}
	mean := 6
	n := 4
	fmt.Println(missingRolls(rolls, mean, n))
}

// rolls = [1], mean = 3, n = 1  -- [5]
func test4() {
	rolls := []int{1}
	mean := 3
	n := 1
	fmt.Println(missingRolls(rolls, mean, n))
}

func missingRolls(rolls []int, mean, n int) []int {
	missingSum := mean * (n + len(rolls))
	for _, roll := range rolls {
		missingSum -= roll
	}
	if missingSum < n || missingSum > n*6 {
		return nil
	}

	quotient, remainder := missingSum/n, missingSum%n
	ans := make([]int, n)
	for i := range ans {
		ans[i] = quotient
		if i < remainder {
			ans[i]++
		}
	}
	return ans
}
